﻿using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.IO;
using System.Collections.Generic;


namespace LabMS.Common
{
    public class FileUpload
    {
        public FileUpload()
        {

        }

        private static string[] ValidatedFileType = { ".gif", ".jpg", ".jpeg", ".bmp", ".png", 
                                     ".zip", ".doc", ".docx", ".xls", ".xlsx"                                     
                                   };

        public void SetValidatedFileType(string[] fileType)
        {
            ValidatedFileType = fileType;
        }

        public string[] GetValidatedFileType()
        {
            return ValidatedFileType;
        }

        /// <summary>
        /// 判断用户是否上传了文件
        /// </summary>
        /// <param name="files">上传文件组</param>
        /// <returns>如果用记上传了文件返回true, 反之返回false</returns>
        public static bool IsFileUpload(HttpFileCollection files)
        {
            if (files.Count != 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// 判断上传文件是否是合法文件
        /// </summary>
        /// <param name="files">所上传的文件</param>
        /// <param name="fileType">合法的文件类型数组</param>
        /// <returns>如果所上传的文件全部合法返回true, 反之返回false</returns>
        public static bool IsValidatedExtension(HttpFileCollection files, string[] fileType)
        {
            string strOldFilePath = "";
            string currFileType = "";
            ValidatedFileType = fileType;

            try
            {
                int i = 0;

                while (files[i].FileName != string.Empty && files[i].FileName != null)
                {
                    // firefox 中 传递的file.FileName 不包含路径,而只包含文件名
                    // 而 IE   中 传递的file.FileName 是包括路径的.
                    if (files[i].FileName.LastIndexOf("\\") == -1)
                    {
                        strOldFilePath = files[i].FileName;
                    }
                    else
                    {
                        strOldFilePath = files[i].FileName.Substring(files[i].FileName.LastIndexOf("\\") + 2);
                    }

                    //取得上传文件的扩展名
                    currFileType = strOldFilePath.Substring(strOldFilePath.LastIndexOf("."));

                    //判断该扩展名是否合法
                    for (int j = 0; j < ValidatedFileType.Length; j++)
                    {
                        if (currFileType.Equals(ValidatedFileType[j]))
                        {
                            // 如果当前文件类型currFileType合法, 则跳出for循环,
                            // i++ 表示检查下一个文件类型的合法性, 只有文件合法了才能检查下一个文件
                            i++;
                            break;
                        }

                        // j == ValidatedFileType.Length - 1 表示检查至最后一个文件类型
                        // !currFileType.Equals(ValidatedFileType[j] 表示与最后一个文件类型也不匹配
                        // 此时表示该为文件不合文件, 返回false
                        if (j == ValidatedFileType.Length - 1 && !currFileType.Equals(ValidatedFileType[j]))
                        {
                            return false;
                        }
                    }

                }
            }
            catch
            {
                return false;
            }

            // 所有文件通过检查,返回true
            return true;
        }

        /// <summary>
        /// 判断上传文件是否是合法文件
        /// </summary>
        /// <param name="files">所上传的文件</param>
        /// <param name="fileType">合法的文件类型数组</param>
        /// <returns>如果所上传的文件全部合法返回true, 反之返回false</returns>
        public static bool IsValidatedExtension(HttpFileCollection files)
        {
            string strOldFilePath = "";
            string currFileType = "";

            try
            {
                int i = 0;

                while (files[i].FileName != string.Empty && files[i].FileName != null)
                {
                    // firefox 中 传递的file.FileName 不包含路径,而只包含文件名
                    // 而 IE   中 传递的file.FileName 是包括路径的.
                    if (files[i].FileName.LastIndexOf("\\") == -1)
                    {
                        strOldFilePath = files[i].FileName;
                    }
                    else
                    {
                        strOldFilePath = files[i].FileName.Substring(files[i].FileName.LastIndexOf("\\") + 2);
                    }

                    //取得上传文件的扩展名
                    currFileType = strOldFilePath.Substring(strOldFilePath.LastIndexOf("."));

                    //判断该扩展名是否合法
                    for (int j = 0; j < ValidatedFileType.Length; j++)
                    {
                        if (currFileType.Equals(ValidatedFileType[j]))
                        {
                            // 如果当前文件类型currFileType合法, 则跳出for循环,
                            // i++ 表示检查下一个文件类型的合法性, 只有文件合法了才能检查下一个文件
                            i++;
                            break;
                        }

                        // j == ValidatedFileType.Length - 1 表示检查至最后一个文件类型
                        // !currFileType.Equals(ValidatedFileType[j] 表示与最后一个文件类型也不匹配
                        // 此时表示该为文件不合文件, 返回false
                        if (j == ValidatedFileType.Length - 1 && !currFileType.Equals(ValidatedFileType[j]))
                        {
                            return false;
                        }
                    }

                }
            }
            catch
            {
                return false;
            }

            // 所有文件通过检查,返回true
            return true;
        }

        #region IsAllowedLengthForFiles
        /// <summary>
        /// 判断上传文件组里的文件大小是否超过最大值
        /// </summary>
        /// <param name="files">上传的文件组</param>
        /// <returns>超过最大值返回false,否则返回true.</returns>
        public static bool IsAllowedLengthForFiles(HttpFileCollection files)
        {

            for (int i = 0; i < files.Count; i++)
            {
                HttpPostedFile file = files[i];

                if (!IsAllowedLengthForFile(file))
                {
                    return false;
                }
            }

            return true;
        }
        #endregion

        #region IsAllowedLengthForFile
        /// <summary>
        /// 判断上传文件大小是否超过最大值
        /// </summary>
        /// <param name="file">上传的文件</param>
        /// <returns>超过最大值返回false,否则返回true.</returns>
        public static bool IsAllowedLengthForFile(HttpPostedFile file)
        {
            //允许上传文件大小的最大值,可以保存在xml文件中,单位为KB
            int i = 20;
            //如果上传文件的大小超过最大值,返回flase,否则返回true.
            if (file.ContentLength > i * 1024)
            {
                return false;
            }
            return true;
        }
        #endregion

        #region GetUniqueString
        /// <summary>
        /// 获取一个不重复的文件名
        /// </summary>
        /// <returns></returns>
        public static string GetUniqueString()
        {
            return DateTime.Now.ToString("yyyyMMddhhmmss");
        }
        #endregion


        #region SaveFiles
        /// <summary>
        /// 上传文件组并返回文件名
        /// </summary>
        /// <param name="hifile">HtmlInputFile控件</param>
        /// <param name="strAbsolutePath">绝对路径.如:Server.MapPath(@"Image/upload")与Server.MapPath(@"Image/upload/")均可,用\符号亦可</param>
        /// <returns>返回的文件名即上传后的文件名</returns>
        public static List<string> SaveFiles(HttpFileCollection files, string strAbsolutePath)
        {
            List<string> fileNames = new List<string>();

            for (int i = 0; i < files.Count; i++)
            {
                string fileName = SaveFile(files[i], strAbsolutePath);

                if (fileName != string.Empty)
                {
                    fileNames.Add(fileName);
                }
            }
            return fileNames;
        }
        #endregion

        #region SaveFile
        /// <summary>
        /// 上传文件并返回文件名
        /// </summary>
        /// <param name="hifile">HtmlInputFile控件</param>
        /// <param name="strAbsolutePath">绝对路径.如:Server.MapPath(@"Image/upload")与Server.MapPath(@"Image/upload/")均可,用\符号亦可</param>
        /// <returns>返回的文件名即上传后的文件名</returns>
        public static string SaveFile(HttpPostedFile file, string strAbsolutePath)
        {
            string strOldFilePath = "";
            string strExtension = "";
            string strNewFileName = "";

            if (file.FileName != string.Empty && file.FileName != null)
            {
                // firefox 中 传递的file.FileName 不包含路径,而只包含文件名
                // 而 IE   中 传递的file.FileName 是包括路径的.
                if (file.FileName.LastIndexOf("\\") == -1)
                {
                    strOldFilePath = file.FileName;
                }
                else
                {
                    strOldFilePath = file.FileName.Substring(file.FileName.LastIndexOf("\\")+1);
                }

                //取得上传文件的扩展名
                strExtension = strOldFilePath.Substring(strOldFilePath.LastIndexOf("."));
                //文件上传后的命名(林时来2008-9-20修改)
                strNewFileName = strOldFilePath + "_" + GetUniqueString() + strExtension;
                //strNewFileName = GetUniqueString() + strExtension;

                try
                {
                    if (strAbsolutePath.LastIndexOf("\\") == strAbsolutePath.Length)
                    {
                        file.SaveAs(strAbsolutePath + strNewFileName);
                    }
                    else
                    {
                        file.SaveAs(strAbsolutePath + "\\" + strNewFileName);
                    }
                }
                catch (HttpException)
                {
                    // 网络异常
                }
                return strNewFileName;
            }
            else
            {
                return "";
            }
        }
        #endregion

        /// <summary>
        /// 完成文件组上传功能
        /// </summary>
        /// <param name="files">上传的文件组</param>
        /// <param name="strAbsolutePath">保存到服务器上的路径</param>
        /// <param name="fileType">合法的文件类型</param>
        public static List<string> UpLoadFiles(HttpFileCollection files, string strAbsolutePath, string[] fileType)
        {
            if (IsFileUpload(files) && IsValidatedExtension(files, fileType) && IsAllowedLengthForFiles(files))
            {
                return SaveFiles(files, strAbsolutePath);
            }
            else
            {
                return null;
            }

        }

        /// <summary>
        /// 完成文件组上传功能
        /// </summary>
        /// <param name="files">上传的文件组</param>
        /// <param name="strAbsolutePath">保存到服务器上的路径</param>
        public static List<string> UpLoadFiles(HttpFileCollection files, string strAbsolutePath)
        {
            if (IsFileUpload(files) && IsValidatedExtension(files) && IsAllowedLengthForFiles(files))
            {
                return SaveFiles(files, strAbsolutePath);
            }
            else
            {
                return null;
            }
        }

    }
}
